package net.service.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import net.dao.PesoHectolitricoDao;
import net.form.ObjetoUtil;
import net.model.PesoHectolitrico;
import net.service.PesoHectolitricoManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PesoHectolitricoManagerImpl implements PesoHectolitricoManager {

	@Autowired
	private PesoHectolitricoDao pesoHectolitricoDao;

	@Transactional
	public List<PesoHectolitrico> getAllPesoHectolitrico() {
		return pesoHectolitricoDao.getAllPesoHectolitrico();
	}

	@Transactional
	public void savePesoHectolitrico(PesoHectolitrico pesoHectolitrico) {
		pesoHectolitricoDao.savePesoHectolitrico(pesoHectolitrico);
	}

	@Transactional
	public double getPesoHectolitrico(double area) {
		double resulPH = 0;
		List<PesoHectolitrico> pesoHectolitricos = getAllPesoHectolitrico();
		Collections.sort(pesoHectolitricos);
		List<PesoHectolitrico> iguales = new ArrayList<PesoHectolitrico>();
		List<PesoHectolitrico> listPH1 = new ArrayList<PesoHectolitrico>();
		List<PesoHectolitrico> listPH1Anterior = new ArrayList<PesoHectolitrico>();
		List<PesoHectolitrico> listPH2 = new ArrayList<PesoHectolitrico>();
		PesoHectolitrico ph1Anterior = null;
		PesoHectolitrico ph1 = null;
		PesoHectolitrico ph2 = null;
		for (PesoHectolitrico ph : pesoHectolitricos) {
			if (ph.getArea() == area) {
				iguales.add(ph);
			} else {
				if (area > ph.getArea()) {
					ph1Anterior = ph1;
					ph1 = ph;
					if (listPH1.size() != 0
							&& !listPH1.get(0).getArea().equals(ph.getArea())) {
						listPH1Anterior = listPH1;
						listPH1 = new ArrayList<PesoHectolitrico>();
					}
					listPH1.add(ph1);
				} else {
					if (iguales.size() == 0) {
						if (ph2 == null) {
							// if (ph1.getArea() == ph.getArea()) {
							// listPH1.add(ph);
							// } else {
							ph2 = ph;
							listPH2.add(ph2);
							// }
						} else {
							if (ph.getArea().equals(ph2.getArea())) {
								listPH2.add(ph);
							} else {
								if (listPH1.size() == 0) {
									listPH1 = listPH2;
									listPH2 = new ArrayList<PesoHectolitrico>();
									listPH2.add(ph);
									ph2 = null;
								} else
									break;
							}
						}
					} else {
						break;
					}
				}
			}
		}
		if (iguales.size() != 0) {
			resulPH = calcularPesoHectolitrico(iguales);
		} else {
			if (listPH1.size() == 0) {
				if (pesoHectolitricos.size() > 0) {
					resulPH = pesoHectolitricos.get(0).getPesoHectolitrico();
				}
			} else {
				if (listPH2.size() == 0) {
					List<PesoHectolitrico> listPHAux = new ArrayList<PesoHectolitrico>();
					listPHAux = listPH1;
					listPH1 = listPH1Anterior;
					listPH2 = listPHAux;
					PesoHectolitrico phAux = ph1;
					ph1 = ph1Anterior;
					ph2 = phAux;
				}
				double resulPH1 = calcularPesoHectolitrico(listPH1);
				double resulPH2 = calcularPesoHectolitrico(listPH2);
				resulPH = ObjetoUtil.calcularrectaYEvaluar(listPH1.get(0)
						.getArea(), resulPH1, listPH2.get(0).getArea(),
						resulPH2, area);
			}
		}

		if (resulPH == 0) {
			if (ph1 == null) {
				if (pesoHectolitricos.size() > 0) {
					resulPH = pesoHectolitricos.get(0).getPesoHectolitrico();
				}
			} else {
				if (ph2 == null) {
					PesoHectolitrico phAux = ph1;
					ph1 = ph1Anterior;
					ph2 = phAux;
				}
			}
			resulPH = ObjetoUtil.calcularrectaYEvaluar(ph1.getArea(),
					ph1.getPesoHectolitrico(), ph2.getArea(),
					ph2.getPesoHectolitrico(), area);
		}
		return resulPH;
	}

	private double calcularPesoHectolitrico(List<PesoHectolitrico> list) {
		double acum = 0;
		for (PesoHectolitrico ph : list) {
			acum += ph.getPesoHectolitrico();
		}
		if (list.size() != 0) {
			acum = acum / list.size();
		}
		return acum;
	}

}
